////////////////////////////////////////////////////////////////////////////////
// Copyright 2005 CORE Solutions Limited
// All rights reserved.
// PROPRIETARY AND CONFIDENTIAL INFORMATION.
// Use is subject to license terms.
//
// FUNCTION ID      :   SYS_LANG
// AUTHOR           :   Victor Zheng 
// DATE CREATE      :   2005/12/21
// DESCRIPTION      :   a DAO file for the function, SYS_LANG
//                  :   
//                  :   
//                  :   
//
// MODIFICATION HISTORY:
// DATE         AUTHOR          VERSION NO.         COMMENT
// -----------  --------------  ------------------  -------------------
// 2005/12/21   Victor Zheng    1.0                 source is generated.
//
//
//
////////////////////////////////////////////////////////////////////////////////

package com.erp.app.admin.sysLang.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.erp.app.admin.sysLang.criteria.SysLangSrchCriteria;
import com.erp.app.admin.sysLang.pk.SysLangPk;
import com.erp.app.admin.sysLang.vo.SysLangVo;
import com.erp.app.common.ProjectConstants;
import com.erp.framework.exceptions.FindRecordException;
import com.erp.framework.model.criteria.SimpleBaseSrchCriteria;
import com.erp.framework.model.dao.SimplePageEditStyleDao;
import com.erp.framework.model.vo.ChildList;
import com.erp.framework.model.vo.SimpleBaseVo;
import com.erp.framework.types.CustomBigInteger;

/**
* <p>A <strong>DAO</strong>(Data Access Object) abstracts and encapsulates
* all access to the persistent store.  The DAO manages the connection with the
* data source to obtain and store data.  Also, the DAO implements
* the access mechanism required to work with the data source,
* and always provides a uniform API to its clients.
*
* @author          Victor Zheng 
* @version 1.0     2005/12/21
* @since           FrameWork 1.0
*
*/
public class SysLangDao extends SimplePageEditStyleDao {

    /**
    * Returns the SQL select statement.
    * @param         obj     the searching criteria
    * @return        a string containing sql query
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected String sqlQuery(SimpleBaseSrchCriteria obj) {

        SysLangSrchCriteria criteria = (SysLangSrchCriteria) obj;
        String whereClause = toWhereClause(criteria);
        String groupByClause = "";
        String orderByClause = "ORDER BY LANG_CODE";

        String sql = "SELECT LANG_CODE, LANG_NAME, ORDER_SEQ, CREATE_USER, CREATE_DATE, "
            + "UPDATE_USER, UPDATE_DATE "
            + "FROM T_SYS_LANG "
            + whereClause
            + groupByClause
            + orderByClause;

        //super.logSqlQuery(sql);
        return sql;
    }

    /**
    * Returns the where clause of a SQL select statement.
    * @param         obj     the searching criteria
    * @return        a string containing the where clause
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected String toWhereClause(SysLangSrchCriteria crit) {

        SysLangSrchCriteria criteria = (SysLangSrchCriteria) crit;
        StringBuffer whereClause = new StringBuffer();

//        if (criteria.getSrchCompanyCode() != null) {
//            whereClause.append(whereClause.length()== 0? "WHERE ": "AND ");
//            whereClause.append(" COMPANY_CODE = '" + criteria.getSrchCompanyCode().trim().toUpperCase()+"' ");
//        }

        /*
        if (criteria.getSrchProgram() != null) {
            whereClause.append(whereClause.length() == 0 ? " WHERE " : " AND ");
            whereClause.append(" SALES_CONTRACT_NO IN ");
            whereClause.append(" (SELECT SALES_CONTRACT_NO FROM T_SALES_CONTRACT_DTL");
            if (criteria.getSrchProgram() != null) {
                whereClause.append(" WHERE PROGRAM ='" + criteria.getSrchProgram().toUpperCase().trim() + "'");
            }
            whereClause.append(")");
        }
        if (criteria.getSrchSalesContractNoFr() != null) {
            whereClause.append(whereClause.length() == 0 ? "WHERE " : "AND ");
            whereClause.append("SALES_CONTRACT_NO >= '"
                + criteria.getSrchSalesContractNoFr().toUpperCase().trim() + "' ");
        }
        if (criteria.getSrchSalesContractNoTo() != null) {
            whereClause.append(whereClause.length() == 0 ? "WHERE " : "AND ");
            whereClause.append("SALES_CONTRACT_NO <= '"
                + criteria.getSrchSalesContractNoTo().toUpperCase().trim() + "' ");
        }
        if (criteria.getSrchPoDateFr() != null) {
            whereClause.append(whereClause.length() == 0 ? "WHERE " : "AND ");
            whereClause.append(" PO_DATE >= TO_DATE('"
                + criteria.getSrchPoDateFr() + "', '"
                + ProjectConstants.ORACLE_INPUT_DATE_FORMAT + "') ");
        }
        if (criteria.getSrchPoDateTo() != null) {
            whereClause.append(whereClause.length() == 0 ? "WHERE " : "AND ");
            whereClause.append(" PO_DATE <= TO_DATE('"
                + criteria.getSrchPoDateTo() + "', '"
                + ProjectConstants.ORACLE_INPUT_DATE_FORMAT + "') ");
        }
        */

        return whereClause.toString();
    }

    /**
    * Returns an array list of child VOs by the parent
    * @param         parent   the incoming parent VO
    * @param         conn     the database connection
    * @return        an array list of child VOs
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    public ChildList selectByParent(SimpleBaseVo parent, Connection conn)
        throws FindRecordException {

        return null;
    }

    /**
    * Constructs a string of SQL insert statement
    * @return        a string of SQL insert statement
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected String sqlInsert() {

        String sql = "INSERT INTO T_SYS_LANG ("
            + "LANG_CODE, LANG_NAME, ORDER_SEQ, CREATE_USER, CREATE_DATE, "
            + "UPDATE_USER, UPDATE_DATE) "
            + "VALUES ("
            + "?, ?, ?, ?, SYSDATE, "
            + "?, ?)";

        //super.logSqlQuery(sql);
        return sql;
    }

    /**
    * Sets the values for a SQL insert or update statement.
    * @param         pStmt   the incoming prepared statement
    * @param         obj     the incoming VO
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected void setValuesForInsertAndModify(PreparedStatement pStmt, Object obj, String opType)
        throws SQLException {

        SysLangVo vo = (SysLangVo) obj;
        int i = 1;

        pStmt.setString(i++, vo.getLangCode());
        setNullableString(pStmt, i++, vo.getLangName());
        setNullableBigInteger(pStmt, i++, vo.getOrderSeq());
        setNullableString(pStmt, i++, vo.getCreateUser());

        if (ProjectConstants.DB_OP_UPDATE.equals(opType))
            setNullableTimestamp(pStmt, i++, vo.getCreateDate());

        setNullableString(pStmt, i++, vo.getUpdateUser());

        if (ProjectConstants.DB_OP_INSERT.equals(opType))
            setNullableTimestamp(pStmt, i++, vo.getUpdateDate());

        if(ProjectConstants.DB_OP_UPDATE.equals(opType)){
            pStmt.setString(i++, vo.getLangCode());
            setNullableTimestamp(pStmt, i++, vo.getUpdateDate());
        }
    }

    /**
    * Sets the values for a SQL insert statement.
    * @param         pStmt   the incoming prepared statement
    * @param         obj     the incoming VO
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected void setValuesForInsert(PreparedStatement pStmt, Object obj)
        throws SQLException {

        setValuesForInsertAndModify(pStmt, obj, ProjectConstants.DB_OP_INSERT);
    }

    /**
    * Constructs a string of SQL update statement
    * @return        a string of SQL update statement
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected String sqlUpdate() {

        String sql = "UPDATE T_SYS_LANG SET LANG_CODE=?, LANG_NAME=?, ORDER_SEQ=?, CREATE_USER=?, CREATE_DATE=?, "
            + "UPDATE_USER=?, UPDATE_DATE=SYSDATE "
            + "WHERE LANG_CODE=? "
            + "AND (UPDATE_DATE IS NULL OR UPDATE_DATE = ?) ";

        //super.logSqlQuery(sql);
        return sql;
    }

    /**
    * Sets the values for a SQL update statement.
    * @param         pStmt   the incoming prepared statement
    * @param         obj     the incoming VO
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected void setValuesForModify(PreparedStatement pStmt, Object obj)
        throws SQLException {

        setValuesForInsertAndModify(pStmt, obj, ProjectConstants.DB_OP_UPDATE);
    }

    /**
    * Constructs a string of SQL delete statement
    * @return        a string of SQL update statement
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected String sqlDelete() {
        String sql = "DELETE FROM T_SYS_LANG WHERE LANG_CODE=? ";

        //super.logSqlQuery(sql);
        return sql;
    }

    /**
    * Sets the values for a SQL delete statement.
    * @param         pStmt   the incoming prepared statement
    * @param         obj     the incoming VO
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected void setValuesForDelete(PreparedStatement pStmt, Object obj)
        throws SQLException {

        SysLangVo vo = (SysLangVo) obj;
        int i = 1;

        pStmt.setString(i++, vo.getLangCode());
    }

    /**
    * Constructs a string of SQL select statement
    * @return        a string of SQL select statement
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected String sqlFind() {

        String sql = "SELECT LANG_CODE, LANG_NAME, ORDER_SEQ, CREATE_USER, CREATE_DATE, "
            + "UPDATE_USER, UPDATE_DATE "
            + "FROM T_SYS_LANG "
            + "WHERE LANG_CODE=? "
            + "ORDER BY LANG_CODE";

        //super.logSqlQuery(sql);
        return sql;
    }

    /**
    * Sets the values for a SQL select statement for finding by primary key.
    * @param         pStmt   the incoming prepared statement
    * @param         obj     the incoming PK
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected void setValuesForFind(PreparedStatement pStmt, Object obj)
        throws SQLException {

        SysLangPk pk = (SysLangPk) obj;
        int i = 1;

        pStmt.setString(i++, pk.getLangCode());
    }

    /**
    * Constructs a string of SQL select statement
    * @return        a string of SQL select statement
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected String sqlList() {

        return null;
    }

    /**
    * Sets the values for a SQL select statement for finding child tables.
    * @param         pStmt   the incoming prepared statement
    * @param         obj     the incoming parent PK
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected void setValuesForList(PreparedStatement pStmt, Object obj)
        throws SQLException {

    }

    /**
    * Sets the values of a result set to a vo
    * @param         rs   the incoming result set
    * @return        a vo containing the result set values
    *
    * @author     Victor Zheng 
    * @since      FrameWork 1.0
    */
    protected SimpleBaseVo getResultSetValues(ResultSet rs) throws SQLException {

        SysLangVo vo = new SysLangVo();

        vo.setLangCode(rs.getString("LANG_CODE"));
        vo.setLangName(rs.getString("LANG_NAME"));
        vo.setOrderSeq(CustomBigInteger.customize(rs.getBigDecimal("ORDER_SEQ")));
        vo.setCreateUser(rs.getString("CREATE_USER"));
        vo.setCreateDate(rs.getTimestamp("CREATE_DATE"));
        vo.setUpdateUser(rs.getString("UPDATE_USER"));
        vo.setUpdateDate(rs.getTimestamp("UPDATE_DATE"));

        return vo;
    }

}
